Skip to content

Fix protocol cache for specialized self overloads - #11649

Merged
Rich Chiodo (rchiodo) merged 2 commits into
mainfrom
rchiodo-investigate-protocol-overload
Aug 18, 2026
Merged

Fix protocol cache for specialized self overloads#11649
Rich Chiodo (rchiodo) merged 2 commits into
mainfrom
rchiodo-investigate-protocol-overload

Conversation

@rchiodo

Copy link
Copy Markdown
Collaborator

Summary

  • avoid caching a generic protocol mismatch as universally incompatible when an overloaded method fails to bind
  • preserve broad negative caching for other protocol mismatches
  • add regression coverage for order-dependent overload resolution

Fixes #11644

Tests

  • npx jest typeEvaluator7.test --forceExit --runInBand
  • npm run build
  • ESLint and Prettier checks for changed TypeScript files

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

This comment has been minimized.

@heejaechang

Copy link
Copy Markdown
Collaborator

🔒 Automated review in progress — Heejae Chang (@heejaechang) is auto-reviewing this PR.

Comment thread packages/pyright-internal/src/analyzer/protocols.ts

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved via Review Center.

@heejaechang Heejae Chang (heejaechang) added the review-auto:approved Automated review: no blocking findings (approval posted). label Aug 17, 2026
@rchiodo

Copy link
Copy Markdown
Collaborator Author

Please address Heejae's comment.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

Diff from mypy_primer, showing the effect of this PR on open source code:

sympy (https://github.com/sympy/sympy)
-   .../projects/sympy/sympy/solvers/ode/nonhomogeneous.py:468:28 - error: Argument of type "Expr | Unknown | None" cannot be assigned to parameter "expr" of type "Expr" in function "make_args"
+   .../projects/sympy/sympy/solvers/ode/nonhomogeneous.py:468:28 - error: Argument of type "Unknown | None" cannot be assigned to parameter "expr" of type "Expr" in function "make_args"
-     Type "Expr | Unknown | None" is not assignable to type "Expr"
+     Type "Unknown | None" is not assignable to type "Expr"
-     Attribute "pop" is unknown (reportAttributeAccessIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:610:22 - error: Cannot access attribute "pop" for class "tuple[()]"
-     Attribute "pop" is unknown (reportAttributeAccessIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:610:22 - error: Cannot access attribute "pop" for class "tuple[str, ...]"
-   .../projects/sympy/sympy/solvers/ode/ode.py:1579:38 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1580:38 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1590:9 - error: No overloads for "update" match the provided arguments (reportCallIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1590:12 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1590:19 - error: Argument of type "Unknown | dict[Unknown, Unknown] | None" cannot be assigned to parameter "m" of type "Iterable[tuple[str, Unknown]]" in function "update"
-     Type "Unknown | dict[Unknown, Unknown] | None" is not assignable to type "Iterable[tuple[str, Unknown]]"
-       "None" is incompatible with protocol "Iterable[tuple[str, Unknown]]"
-         "__iter__" is not present (reportArgumentType)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1597:43 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1597:64 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1603:9 - error: No overloads for "update" match the provided arguments (reportCallIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1603:12 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1603:19 - error: Argument of type "Unknown | dict[Unknown, Unknown] | None" cannot be assigned to parameter "m" of type "Iterable[tuple[str, Unknown]]" in function "update"
-     Type "Unknown | dict[Unknown, Unknown] | None" is not assignable to type "Iterable[tuple[str, Unknown]]"
-       "None" is incompatible with protocol "Iterable[tuple[str, Unknown]]"
-         "__iter__" is not present (reportArgumentType)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1610:43 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1610:74 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1616:9 - error: No overloads for "update" match the provided arguments (reportCallIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1616:12 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1616:19 - error: Argument of type "Unknown | dict[Unknown, Unknown] | None" cannot be assigned to parameter "m" of type "Iterable[tuple[str, Unknown]]" in function "update"
-     Type "Unknown | dict[Unknown, Unknown] | None" is not assignable to type "Iterable[tuple[str, Unknown]]"
-       "None" is incompatible with protocol "Iterable[tuple[str, Unknown]]"
-         "__iter__" is not present (reportArgumentType)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1623:49 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:1623:70 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
+   .../projects/sympy/sympy/solvers/ode/ode.py:1753:36 - error: Cannot access attribute "lhs" for class "Expr"
+     Attribute "lhs" is unknown (reportAttributeAccessIssue)
+   .../projects/sympy/sympy/solvers/ode/ode.py:1753:55 - error: Cannot access attribute "rhs" for class "Expr"
+     Attribute "rhs" is unknown (reportAttributeAccessIssue)
+   .../projects/sympy/sympy/solvers/ode/ode.py:1754:36 - error: Cannot access attribute "lhs" for class "Expr"
+     Attribute "lhs" is unknown (reportAttributeAccessIssue)
+   .../projects/sympy/sympy/solvers/ode/ode.py:1755:17 - error: No overloads for "__setitem__" match the provided arguments (reportCallIssue)
+   .../projects/sympy/sympy/solvers/ode/ode.py:1755:17 - error: Argument of type "Equality | BooleanFalse | BooleanTrue | Unknown | Expr" cannot be assigned to parameter "value" of type "Equality | BooleanFalse | BooleanTrue" in function "__setitem__"
+     Type "Equality | BooleanFalse | BooleanTrue | Unknown | Expr" is not assignable to type "Equality | BooleanFalse | BooleanTrue"
+       Type "Expr" is not assignable to type "Equality | BooleanFalse | BooleanTrue"
+         "Expr" is not assignable to "Equality"
+         "Expr" is not assignable to "BooleanFalse"
+         "Expr" is not assignable to "BooleanTrue" (reportArgumentType)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3442:7 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3442:38 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3443:7 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3443:38 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3444:14 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3445:14 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3446:14 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3458:50 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3459:50 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3460:50 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3500:5 - error: No overloads for "update" match the provided arguments (reportCallIssue)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3500:7 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3500:14 - error: Argument of type "Unknown | dict[Unknown, Unknown] | None" cannot be assigned to parameter "m" of type "Iterable[tuple[str, Unknown]]" in function "update"
-     Type "Unknown | dict[Unknown, Unknown] | None" is not assignable to type "Iterable[tuple[str, Unknown]]"
-       "None" is incompatible with protocol "Iterable[tuple[str, Unknown]]"
-         "__iter__" is not present (reportArgumentType)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3501:18 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3501:43 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3502:9 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3502:16 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3502:24 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3502:31 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3503:9 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3503:15 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3503:23 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3503:30 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3504:7 - error: "update" is not a known attribute of "None" (reportOptionalMemberAccess)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3504:46 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3504:54 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3505:9 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3505:19 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3505:29 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)
-   .../projects/sympy/sympy/solvers/ode/ode.py:3506:10 - error: Object of type "None" is not subscriptable (reportOptionalSubscript)

... (truncated 327 lines) ...

pandas-stubs (https://github.com/pandas-dev/pandas-stubs)
- .../projects/pandas-stubs/tests/indexes/bool/test_add.py
-   .../projects/pandas-stubs/tests/indexes/bool/test_add.py:21:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_add.py:26:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_add.py:36:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_add.py:41:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
- .../projects/pandas-stubs/tests/indexes/bool/test_mul.py
-   .../projects/pandas-stubs/tests/indexes/bool/test_mul.py:39:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_mul.py:47:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_mul.py:62:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/bool/test_mul.py:70:23 - error: "assert_type" mismatch: expected "Index[bool]" but received "Index[int]" (reportAssertTypeFailure)
- .../projects/pandas-stubs/tests/indexes/complex/test_add.py
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:21:23 - error: Operator "+" not supported for types "Index[complex]" and "Literal[True]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:21:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:22:23 - error: Operator "+" not supported for types "Index[complex]" and "Literal[1]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:22:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:23:23 - error: Operator "+" not supported for types "Index[complex]" and "float" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:23:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:26:23 - error: Operator "+" not supported for types "Literal[True]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:26:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:27:23 - error: Operator "+" not supported for types "Literal[1]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:27:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:28:23 - error: Operator "+" not supported for types "float" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:28:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:36:23 - error: Operator "+" not supported for types "Index[complex]" and "list[bool]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:36:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:37:23 - error: Operator "+" not supported for types "Index[complex]" and "list[int]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:37:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:38:23 - error: Operator "+" not supported for types "Index[complex]" and "list[float]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:38:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:41:23 - error: Operator "+" not supported for types "list[bool]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:41:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:42:23 - error: Operator "+" not supported for types "list[int]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:42:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:43:23 - error: Operator "+" not supported for types "list[float]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_add.py:43:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
- .../projects/pandas-stubs/tests/indexes/complex/test_mul.py
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:39:23 - error: Operator "*" not supported for types "Index[complex]" and "Literal[True]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:39:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:40:23 - error: Operator "*" not supported for types "Index[complex]" and "Literal[1]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:40:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:41:23 - error: Operator "*" not supported for types "Index[complex]" and "float" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:41:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:47:23 - error: Operator "*" not supported for types "Literal[True]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:47:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:48:23 - error: Operator "*" not supported for types "Literal[1]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:48:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:49:23 - error: Operator "*" not supported for types "float" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:49:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:62:23 - error: Operator "*" not supported for types "Index[complex]" and "list[bool]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:62:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:63:23 - error: Operator "*" not supported for types "Index[complex]" and "list[int]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:63:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:64:23 - error: Operator "*" not supported for types "Index[complex]" and "list[float]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:64:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:70:23 - error: Operator "*" not supported for types "list[bool]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:70:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:71:23 - error: Operator "*" not supported for types "list[int]" and "Index[complex]" (reportOperatorIssue)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:71:23 - error: "assert_type" mismatch: expected "Index[complex]" but received "Unknown" (reportAssertTypeFailure)
-   .../projects/pandas-stubs/tests/indexes/complex/test_mul.py:72:23 - error: Operator "*" not supported for types "list[float]" and "Index[complex]" (reportOperatorIssue)

... (truncated 61 lines) ...

@rchiodo
Rich Chiodo (rchiodo) merged commit d5e77a7 into main Aug 18, 2026
20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review-auto:approved Automated review: no blocking findings (approval posted).

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Order-dependent overload resolution failure due to memorised Protocol conformance check on generic class

2 participants